package s.c.server;

import com.alibaba.fastjson.JSONObject;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import s.c.domain.ChatEntityStr;
import s.c.helper.SendHelper;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Author: SYL
 * @Date: 2024/7/24
 */
@ServerEndpoint("/person/{userId}")
@Component
@Slf4j
public class WebSocketServer {

    private static Map<String, WebSocketServer> SOCKET_MAP = new ConcurrentHashMap<>();

    @Getter
    private Session session;


    @OnOpen
    public void open(Session session, @PathParam("userId") String userId) {
        this.session = session;
        SOCKET_MAP.put(userId, this);
        log.info("用户{}连接成功,当前链接总人数{}", userId, SOCKET_MAP.size());
    }

    @OnClose
    public void close(Session session, @PathParam("userId") String userId) {
        SOCKET_MAP.remove(userId);
        log.info("用户{}断开连接,当前链接总人数{}", userId, SOCKET_MAP.size());
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("收到用户{}的消息:{}", session.getId(), message);
        ChatEntityStr chatEntity = JSONObject.parseObject(message, ChatEntityStr.class);
        WebSocketServer socketServer = SOCKET_MAP.get(chatEntity.getTo());
        if (null == socketServer) {
            //用户不在线
            log.info("用户{}不在线", chatEntity.getTo());
            return;
        }
        SendHelper.sendToPersonStr(message, socketServer.getSession());
    }

    @OnError
    public void onError(Session session, Throwable error) {
        log.error("发生错误:{}", session.getId());
        error.printStackTrace();
    }

//    /**
//     * 指定发消息
//     *
//     * @param message
//     */
//    public void sendMessage(String message) {
//        try {
//            this.session.getBasicRemote().sendText(message);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 群发消息
//     *
//     * @param message
//     */
//    public static void fanoutMessage(String message) {
//        webSocketServerMap.values().forEach(ws -> ws.sendMessage(message));
//    }

}
